/**
 * Clase utilizada para manipular la base de datos del Banco de Proyectos
 * @author carlos
 */
package uast.bpdex.BaseDatos;


import java.sql.*;
import uast.bpdex.*;
import java.util.LinkedList;



public class DataBase {
  private String dbname = "bpdex";
  private String usr = "postgres";
  private String pssw = "1234";
  private String port = "5432";
  private Connection conn;
  private static String[] trabArray = {"usr", "nombre", "apellido", "ci", "email", "telefono", "departamento", "coordinacion", "tipo"};
  private static String[] evArray = {"usr", "nombre", "apellido", "ci", "email", "telefono", "departamento", "coordinacion", "tipo", "esevaluador"};
  private static String[] usrArray = {"nombre", "contrasena, bloqpcl, pregunta, respuesta"};
  private static String[] persArray = {"usr", "nombre", "apellido", "ci", "email", "telefono"};
  private static String[] comArray = {"usr", "nombre", "ubicacion", "rif", "email", "telefono", "estado", "municipio", "parroquia", "sector", "miembros", "mision", "numMiembros"};
  private static String[] asocArray = {"usr", "nombre", "ubicacion", "rif", "email", "telefono", "estado", "municipio", "parroquia", "sector", "miembros", "mision"};
  private static String[] estudArray = {"usr", "nombre", "apellido", "ci", "email", "telefono", "carnet", "carrera"};
  private static String[] benArray = {"usr", "nombre", "ubicacion", "rif", "email", "telefono"};
  
  /**
   * Constructor de la clase
   */
  public DataBase() throws Exception{
      try{
        Class.forName("org.postgresql.Driver");
        this.conn = DriverManager.getConnection("jdbc:postgresql://localhost:" + this.port +"/" + dbname + "?user=" + usr + "&password=" + pssw);
      }catch (ClassNotFoundException ex0){
         throw new Exception("Error ubicando el driver de la base de datos");
      }catch (SQLException ex1){
          throw new Exception("Error al acceder a la base de datos: " + ex1.getMessage());
      }
  }
  
  /**
   * Metodo genérico para insertar elementos en una tabla. Los atributos deben ser pasados en el
   * mismo orden en que se encuentran en la tabla
   */
  private void insert(String tabla, String[] valores) throws Exception{
      try{
        Statement queryE = this.conn.createStatement();
        String query = "INSERT INTO " + tabla + " VALUES("; 
        int i;
        
        for(i = 0; i < valores.length; ++ i){
            if(i != valores.length - 1){
                query = query + "'" + valores[i] + "',";
            }else{
                query = query + "'" + valores[i] + "');";
            }
        }
        /*if(tabla == "usuarios"){
            FileOutputStream out = new FileOutputStream("/home/carlos/Escritorio/debug.txt");
            PrintStream p = new PrintStream(out);
            p.println(query);
        }*/
        queryE.executeUpdate(query);
      } catch(SQLException ex0){
          throw new Exception("Error al insertar el elemento: " + ex0.getMessage());
      }
  }
  
  private ResultSet select(String tabla, String id, String idName) throws Exception{
      /*Statement queryE = this.conn.createStatement();
      int i;
      boolean first = true;
      String query = "SELECT * FROM " + tabla + " WHERE ";
      for (i = 0; i < idName.length; ++ i){
          if(idName[i].equals(""))
              continue;
          if (first){
            query = query + idName[i] + "=" + id[i];
            first = false;
          }else{
            query = query + "AND" + idName[i] + "=" + id[i];
          }
      }
      query = query + ";";
      ResultSet ret = queryE.executeQuery(query);*/
      return null;
  }
 
  /*
   * Metodo utilizado para obtener tuplas de la base de datos basandose en las solicitudes de
   * coincidencia que se reciban.
   * 
   * Parametros: String tabla -> Nombre de la tabla de la que se desean obtener los atributos
   *             String[] id -> Arreglo con los valores de los atributos de la tabla con los que se quiere 
   *                            buscar coincidencia. Si alguna entrada es vacia, se asume que no importa
   *                            el valor de dicho atributo
   *             String[] idName -> Arreglo de strings en el que la posicion 'i' corresponde al nombre
   *                                de la columna de la tabla 'tabla' con la que se desea hacer match
   *                                el valor 'id[i]'.
   * Salida: El ResultSet con las tuplas que concuerdan con el select deseado
   */
  private ResultSet select2(String tabla, String[] id, String[] idName) throws Exception{
  
      Statement queryE = this.conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
      int i;
      boolean first = true;
      String query = "SELECT * FROM " + tabla;

      for (i = 0; i < idName.length; ++ i){
          if(id[i].equals(""))
              continue;
          if (first){
            query = query + " WHERE " + idName[i] + " = '" + id[i] + "'";
            first = false;
          }else{
            query = query + " AND " + idName[i] + "='" + id[i] + "'";
          }
      }
      query = query + ";";
      return queryE.executeQuery(query);
   }

  
   private ResultSet select3(String tabla, String id, String idName) throws Exception{
      Statement queryE = this.conn.createStatement();
      String query = "SELECT * FROM " + tabla + " WHERE " + idName + " = '" + id + "';";
      ResultSet ret = queryE.executeQuery(query);  
      System.out.println(query);
      if (ret!=null){
          System.out.println("ret de database no es nulo");
      }
      return ret;      
   }

//   Metodo para agregar un profesor a la base de datos
  public void agregarProfesor(Profesor prof) throws Exception{
    String[] valores = new String[5];
    valores[0] = prof.getUsr();
    valores[1] = prof.getPssw();
    valores[2] = "0";
    valores[3] = prof.getPregunta();
    valores[4] = prof.getRespuesta();
    this.insert("usuarios", valores);
    valores = new String[10];
    valores[0] = prof.getUsr();
    valores[1] = prof.getNombre();
    valores[2] = prof.getApellido();
    valores[3] = prof.getCi();
    valores[4] = prof.getSexo();
    valores[5] = prof.getEmail();
    valores[6] = prof.getTlf();
    valores[7] = prof.getDpto();
    valores[8] = prof.getCord();
    valores[9] = "profesor";
    this.insert("trabajadores", valores);
  }
 
  //Metodo para agregar a un obrero a la base de datos
  public void agregarObrero(Obrero obr) throws Exception{
    String[] valores = new String[5];
    valores[0] = obr.getUsr();
    valores[1] = obr.getPssw();
    valores[2] = "0";
    valores[3] = obr.getPregunta();
    valores[4] = obr.getRespuesta();
     this.insert("usuarios", valores);
    valores = new String[10];
    valores[0] = obr.getUsr();
    valores[1] = obr.getNombre();
    valores[2] = obr.getApellido();
    valores[3] = obr.getCi();
    valores[4] = obr.getSexo();
    valores[5] = obr.getEmail();
    valores[6] = obr.getTlf();
    valores[7] = obr.getDpto();
    valores[8] = obr.getCord();
    valores[9] = "obrero";
    this.insert("trabajadores", valores);
  }

  //Metodo para agregar a un empleado a la base de datos
  public void agregarEmpleado(Empleado empl) throws Exception{
    String[] valores = new String[5];
    valores[0] = empl.getUsr();
    valores[1] = empl.getPssw();
    valores[2] = "0";
    valores[3] = empl.getPregunta();
    valores[4] = empl.getRespuesta();
    this.insert("usuarios", valores);
    valores = new String[10];
    valores[0] = empl.getUsr();
    valores[1] = empl.getNombre();
    valores[2] = empl.getApellido();
    valores[3] = empl.getCi();
    valores[4] = empl.getSexo();
    valores[5] = empl.getEmail();
    valores[6] = empl.getTlf();
    valores[7] = empl.getDpto();
    valores[8] = empl.getCord();
    valores[9] = "empleado";
    this.insert("trabajadores", valores);
  }

    //Metodo para agregar a un estudiante a la base de datos
  public void agregarEstudiante(Estudiante est) throws Exception{
    String[] valores = new String[5];
    valores[0] = est.getUsr();
    valores[1] = est.getPssw();
    valores[2] = "0";
    valores[3] = est.getPregunta();
    valores[4] = est.getRespuesta();    
    this.insert("usuarios", valores);
    valores = new String[9];
    valores[0] = est.getUsr();
    valores[1] = est.getNombre();
    valores[2] = est.getApellido();
    valores[3] = est.getCi();
    valores[4] = est.getSexo();
    valores[5] = est.getEmail();
    valores[6] = est.getTlf();
    valores[7] = est.getCarnet();
    valores[8] = est.getCarrera();
    this.insert("estudiantes", valores);
  }

  //Metodo para agregar a una comunidad a la base de datos
  public void agregarComunidad(Comunidad com) throws Exception{
      String[] valores = new String[5];
      valores[0] = com.getUsr();
      valores[1] = com.getPssw();
      valores[2] = "0";
      valores[3] = com.getPregunta();
      valores[4] = com.getRespuesta();    
      this.insert("usuarios", valores);
      valores = new String[13];
      valores[0] = com.getUsr();
      valores[1] = com.getNombre();
      valores[2] = com.getUg();
      valores[3] = com.getRif();
      valores[4] = com.getEmail();
      valores[5] = com.getTlf();
      valores[6] = com.getEstado();
      valores[7] = com.getMunicipio();
      valores[8] = com.getParroquia();
      valores[9] = com.getSector();
      valores[10] = com.getMiembros();
      valores[11] = com.getMision();
      valores[12] = com.getNumM();
      this.insert("comunidades", valores);
  }
  
    //Metodo para agregar a una asociacion civil a la base de datos
  public void agregarAsoCivil(AsoCivil ac) throws Exception{
      String[] valores = new String[5];
      valores[0] = ac.getUsr();
      valores[1] = ac.getPssw();
      valores[2] = "0";
      valores[3] = ac.getPregunta();
      valores[4] = ac.getRespuesta();    
      this.insert("usuarios", valores);
      valores = new String[12];
      valores[0] = ac.getUsr();
      valores[1] = ac.getNombre();
      valores[2] = ac.getUg();
      valores[3] = ac.getRif();
      valores[4] = ac.getEmail();
      valores[5] = ac.getTlf();
      valores[6] = ac.getEstado();
      valores[7] = ac.getMunicipio();
      valores[8] = ac.getParroquia();
      valores[9] = ac.getSector();
      valores[10] = ac.getMiembros();
      valores[11] = ac.getMision();
      this.insert("asocciviles", valores);
  }
  
  //Metodo para agregar un benefactor a la base de datos
  public void agregarBenefactor(Benefactor ben) throws Exception{
      String valores[] = new String[5];
      valores[0] = ben.getUsr();
      valores[1] = ben.getPssw();
      valores[2] = "0";
      valores[3] = ben.getPregunta();
      valores[4] = ben.getRespuesta();
      this.insert("usuarios", valores);
      valores = new String[6];
      valores[0] = ben.getUsr();
      valores[1] = ben.getNombre();
      valores[2] = ben.getUbicacion();
      valores[3] = ben.getRif();
      valores[4] = ben.getEmail();
      valores[5] = ben.getTlf();
      this.insert("benefactores", valores);
  }
  
  public void agregarProyectext (Proyectext proye) throws Exception{
     String[] valores = new String[15];
     valores[0] = proye.getId();
     valores[1] = proye.getTlf();
     valores[2] = proye.getResp();
     valores[3] = proye.getNombAval();
     valores[4] = proye.getLSCEES();
     valores[5] = proye.getDatosPob();
     valores[6] = proye.getAnho();
     valores[7] = proye.getMesTent();
     valores[8] = proye.getMes();
     valores[9] = proye.getAnhoTent();
     valores[10] = proye.getDiaTent();
     valores[11] = proye.getDia();
     valores[12] = proye.getAsoInter();
     valores[13] = proye.getOriginal();
     valores[14] = proye.getAplic();
     this.insert("proyectext", valores);
  }
  
  public void agregarProyectlcp (Proyectlcp proyl) throws Exception{
     String[] valores = new String[10];
     valores[0] = proyl.getId();
     valores[1] = proyl.getObjetivos();
     valores[2] = proyl.getJustificacion();
     valores[3] = proyl.getNromujer();
     valores[4] = proyl.getNrohombre();
     valores[5] = proyl.getNronino();
     valores[6] = proyl.getNroadulto();
     valores[7] = proyl.getNrodisc();
     valores[8] = proyl.getNrootro();
     valores[9] = proyl.getMontolcp();
     this.insert("proyectlcp", valores);
  }
  
  public void agregarPlanOperativo (PlanOperativo po) throws Exception{
      String[] valores = new String[8];
      valores[0] = po.getProid();
      valores[1] = po.getObjetivos();
      valores[2] = po.getMetas();
      valores[3] = po.getActividad();
      valores[4] = po.getTiempo();
      valores[5] = po.getRecursos();
      valores[6] = po.getResultado();
      valores[7] = po.getResponsable();
      this.insert("planoperativo", valores);
  }
  
  public void agregarRecursos (Recursos rec) throws Exception{
      String[] valores = new String[8];
      valores[0] = rec.getProid();
      valores[1] = rec.getActividad();
      valores[2] = rec.getRecursos();
      valores[3] = rec.getCosto();
      valores[4] = rec.getAportorga();
      valores[5] = rec.getAportotro();
      valores[6] = rec.getAportcomu();
      valores[7] = rec.getMonto();
      this.insert("recursos", valores);
  }
    //Metodo para agregar un proyecto a la base de datos
  public void agregarProyecto(Proyecto proy) throws Exception{
      String[] valores = new String[27];
      valores[0] = proy.getId();
      valores[1] = proy.getNombre();
        valores[2] = proy.getNombProy();
        valores[3] = proy.getResumen();
        valores[4] = proy.getArea();
        valores[5] = proy.getMuniBenef();
        valores[6] = proy.getEdoBenef();
        valores[7] = proy.getComunBenef();
        valores[8] = proy.getObjetivo();
        valores[9] = proy.getProduct();
        valores[10] = proy.getNombMiembros();
        valores[11] = proy.getNroMiembros();
        valores[12] = proy.getNombInsti();
        valores[13] = proy.getNroInsti();
        valores[14] = proy.getMontoPropio();
        valores[15] = proy.getMontoOtros();
        valores[16] = proy.getMontoBPDEx();
        valores[17] = proy.getcTotal();
        valores[18] = proy.getBenef();
        valores[19] = proy.getEval();
        valores[20] = proy.getRelevancia();
        valores[21] = proy.getAsoExter();
        valores[22] = proy.getCapacEjec();
        valores[23] = proy.getNroProf();
        valores[24] = proy.getNroObr();
        valores[25] = proy.getNroEst();
        valores[26] = proy.getNroEmp();
      this.insert("proyectos", valores);
  }
  
  //Metodo para agregar el Plan de Ejecucion de un proyecto a la base de datos
  public void agregarPlanEjecucion(PlanEjecucion pe) throws Exception{
      String[] valores = new String[3];
      valores[0] = pe.getId();
      valores[1] = pe.getActividades();
      valores[2] = pe.getProductos();
      this.insert("planejecucion", valores);
  }

  public void agregarPlanFinanciero(PlanFinanciero pf) throws Exception{
      String[] valores = new String[6];
      valores[0] = pf.getId();
      valores[1] = pf.getActividad();
      valores[2] = pf.getProducto();
      valores[3] = pf.getReqFinanciero();
      valores[4] = pf.getLapsoEjec();
      valores[5] = pf.getFechaRequision();
      this.insert("planfinanciero", valores);
  }

  public void agregarPresupuesto(Presupuesto pre) throws Exception{
      String[] valores = new String[5];
      valores[0] = pre.getId();
      valores[1] = pre.getRubro();
      valores[2] = pre.getRecursos();
      valores[3] = pre.getAportes();
      valores[4] = pre.getSolicitado();
      this.insert("presupuesto", valores);
  }
  
  public void agregarRelacionGastos(RelacionGastos rg) throws Exception{
      String[] valores = new String[4];
      valores[0] = rg.getId();
      valores[1] = rg.getMes();
      valores[2] = rg.getSaldo();
      valores[3] = rg.getObservaciones();
      this.insert("relaciongastos", valores);
  }
  
  public void agregarGastosMes(GastosMes gm) throws Exception{
      String[] valores = new String[9];
      valores[0] = gm.getId();
      valores[1] = gm.getMes();
      valores[2] = gm.getFecha();
      valores[3] = gm.getFactura();
      valores[4] = gm.getConcepto();
      valores[5] = gm.getBeneficiario();
      valores[6] = gm.getRifci();
      valores[7] = gm.getTotal();
      valores[8] = gm.getNeto();
      this.insert("gastosmes", valores);
  }


  // Metodo para agregar un informe de gestion o informe final del proyecto
  public void agregarInfoGestion(InfoGestion ig) throws Exception {
      String[] valores = new String[11];
      valores[0] = ig.getId();
      valores[1] = ig.getResumen();
      valores[2] = ig.getLogros();
      valores[3] = ig.getFortaleza();
      valores[4] = ig.getOportunidad();
      valores[5] = ig.getDebilidad();
      valores[6] = ig.getAmenaza();
      valores[7] = ig.getIndicadores();
      valores[8] = ig.getResultFis();
      valores[9] = ig.getResultFinan();
      valores[10] = ig.getConclu();
      this.insert("infogestion", valores);
  }

  
  /*
   * Método que permite buscar a un estudiante en la base de datos
   * Parámetros: String[] id -> Contiene los valores de los campos con los que se
   *                            desea hacer match, rigiendose por el orden indicado
   *                            en la variable 'arr' de la clase correspondiente.
   *                            Si el valor de alguna entrada es vacio, se asume que
   *                            no interesa el valor del campo
   * Salida: Arreglo con los elementos encontrados
   */
  public Estudiante[] buscarEstudiante(String[] id){
      try{
          Estudiante[] ret;
          int i;
          ResultSet rs = this.select2("estudiantes", id, DataBase.estudArray);
          int size;
          if (!rs.next()){
              return null;
          }
          rs.last();
          size = rs.getRow();
          rs.beforeFirst();
          ret = new Estudiante[size];
          for(i = 0; i < size; ++ i){
            rs.next();
            ret[i] = new Estudiante();
            ret[i].setUsr(rs.getString("usr"));
            ret[i].setNombre(rs.getString("nombre"));
            ret[i].setApellido(rs.getString("apellido"));
            ret[i].setCi(rs.getString("ci"));
            ret[i].setEmail(rs.getString("email"));
            ret[i].setTlf(rs.getString("telefono"));
            ret[i].setCarnet(rs.getString("carnet"));
            ret[i].setCarrera(rs.getString("carrera"));
          }
          return ret;
      }catch(Exception e0){
          return null;
      }
 }
  
  /* Método que permite ubicar un usuario en la base de datos utilizando como parámetro de búsqueda su nombre de usuario
   * Parámetros: String urnm -> Nombre de usuario que se desea ubicar
   * Salida: Usuario encontrado en la base de datos, null si no se encontró ninguno
   */
  public Usuario buscarUsr(String usrnm){
    try{
      Usuario ret = new Usuario();
      String id[] = {usrnm};
      String arr[] = {"nombre"};
      String query = "SELECT * FROM usuarios WHERE nombre = '" + usrnm + "';";
      Statement queryE = this.conn.createStatement();
      ResultSet rs = queryE.executeQuery(query);
      if(!rs.next()){
        return null;
      }
      ret.setClave(rs.getString("contrasena"));
      ret.setNombre(rs.getString("nombre"));
      ret.setPregunta(rs.getString("pregunta"));
      ret.setRespuesta(rs.getString("respuesta"));

      return ret;
    }catch(Exception e0){
      Usuario u = new Usuario();
      u.setNombre(e0.getMessage());
      return u;
    }
  }
  
  public LinkedList buscarProyectos(String id, String param){
      try{
          ResultSet rs = this.select3("proyectos", id, param); 
          
          LinkedList<Proyecto> l = new LinkedList ();
          if (!rs.next())
          {              
              return null;
          }
          do{
              Proyecto proy = new Proyecto();
              proy.setNombProy(rs.getString("nombreproy"));
              proy.setArea(rs.getString("area"));
              proy.setMuniBenef(rs.getString("munibenef"));
              proy.setEdoBenef(rs.getString("edobenef"));
              proy.setComunBenef(rs.getString("comunbenef"));
              proy.setEval(rs.getString("eval"));
              proy.setResumen(rs.getString("resumen"));
              proy.setObjetivo(rs.getString("objetivo"));
              proy.setProduct(rs.getString("product"));
              proy.setNombMiembros(rs.getString("nombmiembros"));
              proy.setNroMiembros(rs.getString("nromiembros"));
              proy.setNombInsti(rs.getString("nombinsti"));
              proy.setNroInsti(rs.getString("nroinsti"));
              proy.setMontoPropio(rs.getString("montopropio"));
              proy.setMontoOtros(rs.getString("montootros"));
              proy.setMontoBPDEx(rs.getString("montobpdex"));
              proy.setcTotal(rs.getString("montoctotal"));
              proy.setBenef(rs.getString("benef"));
              proy.setEval(rs.getString("eval"));
              proy.setRelevancia(rs.getString("relevancia"));
              proy.setAsoExter(rs.getString("asoexter"));
              proy.setCapacEjec(rs.getString("capacejec"));
              proy.setNroProf(rs.getString("nroprofesores"));
              proy.setNroObr(rs.getString("nroobreros"));
              proy.setNroEst(rs.getString("nroestudiantes"));
              proy.setNroEmp(rs.getString("nroempleados"));
              
              proy.setId(rs.getString("id"));
              l.add(proy);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 } 
  
  public LinkedList buscarProyectoLey(String id){
      try{
          ResultSet rs = this.select3("proyectlcp", id, "id"); 
          
          LinkedList<Proyectlcp> l = new LinkedList ();
          if (!rs.next())
          {              
              return null;
          }
          do{
              Proyectlcp proy = new Proyectlcp("","","","","","","","","","");
              proy.setJustificacion(rs.getString("justificacion"));
              proy.setMontolcp(rs.getString("montolcp"));
              proy.setNroadulto(rs.getString("nroadulto"));
              proy.setNrodisc(rs.getString("nrodisc"));
              proy.setNrohombre(rs.getString("nrohombre"));
              proy.setNromujer(rs.getString("nromujer"));
              proy.setNronino(rs.getString("nronino"));
              proy.setNrootro(rs.getString("nrootro"));
              proy.setObjetivos(rs.getString("objetivos"));
              proy.setId(rs.getString("id"));
              l.add(proy);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 }
  
  
public LinkedList buscarProyectoExt(String id){
      try{
          ResultSet rs = this.select3("proyectext", id, "id"); 
          System.out.println("paso el select");
          LinkedList<Proyectext> l = new LinkedList ();
          if (!rs.next())
          {              
              return null;
          }
          do{
              System.out.println("llegó al do proyExt");
              Proyectext proy = new Proyectext("","","","","","","","","","","","","","","");
              proy.setLSCEES(rs.getString("lscees"));
              System.out.println("llegó al do proyExt2");
              proy.setResp(rs.getString("responsable"));
              proy.setAnho(rs.getString("anho"));
              proy.setMesTent(rs.getString("mestent"));
              proy.setAnhoTent(rs.getString("anhotent"));
              proy.setDatosPob(rs.getString("datospob"));
              proy.setNombAval(rs.getString("nombreaval"));
              proy.setTlf(rs.getString("telefono"));
              proy.setMes(rs.getString("mes"));
              proy.setAplic(rs.getString("aplic"));
              proy.setOriginal(rs.getString("original"));
              proy.setDiaTent(rs.getString("diatent"));
              proy.setDia(rs.getString("dia"));
              proy.setAsoInter(rs.getString("asointer"));
              l.add(proy);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 }  
  
  
public LinkedList buscarPlanOperativo(String id){
      try{
          ResultSet rs = this.select3("planoperativo", id, "proid"); 
          
          LinkedList<String[]> l = new LinkedList ();
          if (!rs.next())
          {              
              return null;
          }
          do{              
              String[] str = new String[7];
              str[0] = rs.getString("objetivos");
              str[1] = rs.getString("metas");
              str[2] = rs.getString("actividad");
              str[3] = rs.getString("tiempo");
              str[4] = rs.getString("recursos");
              str[5] = rs.getString("resultado");
              str[6] = rs.getString("responsable");
              l.add(str);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 }  

public LinkedList buscarRecursos(String id){
      try{
          ResultSet rs = this.select3("recursos", id, "proid"); 
          
          LinkedList<String[]> l = new LinkedList ();
          if (!rs.next())
          {              
              return null;
          }
          do{              
              String[] str = new String[7];
              str[0] = rs.getString("actividad");
              str[1] = rs.getString("recursos");
              str[2] = rs.getString("costo");
              str[3] = rs.getString("aportorga");
              str[4] = rs.getString("aportotro");
              str[5] = rs.getString("aportcomu");
              str[6] = rs.getString("monto");
              l.add(str);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 }

public LinkedList buscarInfoGestion(String id){
      try{
          ResultSet rs = this.select3("infogestion", id, "id"); 
          
          LinkedList<InfoGestion> l = new LinkedList ();
          if (!rs.next())
          {              
              return null;
          }
          do{    
              System.out.println("entra aqui");
              InfoGestion info = new InfoGestion();
              info.setAmenaza(rs.getString("amenaza"));
              System.out.println("entra aqui2");
              info.setConclu(rs.getString("conclu"));
              info.setDebilidad(rs.getString("debilidad"));
              info.setFortaleza(rs.getString("fortaleza"));
              info.setIndicadores(rs.getString("indicadores"));
              info.setLogros(rs.getString("logros"));
              System.out.println("entra aqui3");
              info.setOportunidad(rs.getString("oportunidad"));
              info.setResultFinan(rs.getString("resultfinan"));
              info.setResultFis(rs.getString("resultfis"));
              info.setResumen(rs.getString("resumen"));
              l.add(info);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 }

public LinkedList buscarRelacionDeGastos(String mes){
      try{
          ResultSet rs = this.select3("gastosmes", mes, "mes"); 
          ResultSet rs2 = this.select3("relaciongastos", mes, "mes"); 
          LinkedList<String[]> l = new LinkedList ();
          if (!rs.next() || !rs2.next())
          {              
              return null;
          }
          do{              
              String[] str = new String[11];
              str[0] = rs2.getString("mes");
              str[1] = rs2.getString("saldo");
              str[2] = rs2.getString("observaciones");
              str[3] = rs.getString("neto");
              str[4] = rs.getString("fecha");
              str[5] = rs.getString("factura");
              str[6] = rs.getString("concepto");
              str[7] = rs.getString("beneficiario");
              str[8] = rs.getString("rifci");
              str[9] = rs.getString("total");
              
              l.add(str);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 }

public LinkedList buscarPresupuesto(String id){
      try{
          ResultSet rs = this.select3("presupuesto", id, "id"); 
          
          LinkedList<String[]> l = new LinkedList ();
          if (!rs.next())
          {              
              return null;
          }
          do{              
              String[] str = new String[3];
              str[0] = rs.getString("recursos");
              str[1] = rs.getString("aportes");
              str[2] = rs.getString("solicitado");
              l.add(str);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 }  

public LinkedList buscarPlanFinanciero(String id){
      try{
          ResultSet rs = this.select3("planfinanciero", id, "id"); 
          
          LinkedList<String[]> l = new LinkedList ();
          if (!rs.next())
          {              
              return null;
          }
          do{              
              String[] str = new String[5];
              str[0] = rs.getString("actividad");
              str[1] = rs.getString("producto");
              str[2] = rs.getString("reqfinanciero");
              str[3] = rs.getString("lapsoejec");
              str[4] = rs.getString("fecharequision");
              l.add(str);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 }  

public LinkedList buscarUsuario(String mes){
      try{
          ResultSet rs = this.select3("gastosmes", mes, "mes"); 
          ResultSet rs2 = this.select3("relaciongastos", mes, "mes"); 
          LinkedList<String[]> l = new LinkedList ();
          if (!rs.next() || !rs2.next())
          {              
              return null;
          }
          do{              
              String[] str = new String[11];
              str[0] = rs2.getString("mes");
              str[1] = rs2.getString("saldo");
              str[2] = rs2.getString("observaciones");
              str[3] = rs.getString("neto");
              str[4] = rs.getString("fecha");
              str[5] = rs.getString("factura");
              str[6] = rs.getString("concepto");
              str[7] = rs.getString("beneficiario");
              str[8] = rs.getString("rifci");
              str[9] = rs.getString("total");
              
              l.add(str);
          }while (rs.next());           
          return l;
      }catch(Exception e0){
          return null;
      }
 }
  

public String[] JoinComunidades(String user)
{
    String query =  "SELECT usr, c.nombre, rif, email, municipio, estado, "
            + "ubicacion, miembros, mision, telefono FROM usuarios AS u "
            + "INNER JOIN comunidades AS c ON (u.nombre = c.usr) "
            + "WHERE usr = " + "'" +user+ "'" +";";
    try{
    Statement queryE = this.conn.createStatement();
    ResultSet ret  = queryE.executeQuery(query);
    
    if (!ret.next())
        return null;
    else
    {
        String[] str = new String[9];
        str[0] = "comunidades";
        str[1] = ret.getString("usr");
        str[2] = ret.getString("nombre");
        str[3] = ret.getString("rif");
        str[4] = ret.getString("email");
        str[5] = ret.getString("ubicacion") +".\n Municipio " 
                + ret.getString("municipio") +".\n Estado " + ret.getString("estado");
        str[6] = ret.getString("miembros");
        str[7] = ret.getString("mision");
        str[8] = ret.getString("telefono");
        return str;
    }
    
    }
    catch (SQLException e)
    {
        return null;
    }
    
}

public String[] JoinAsocCiviles(String user)
{
    String query =  "SELECT usr, a.nombre, rif, email, municipio, estado, "
            + "ubicacion, miembros, mision, telefono  FROM usuarios AS u "
            + "INNER JOIN asocciviles AS a ON (u.nombre = a.usr) "
            + "WHERE usr = " + "'" + user + "'" + ";";
    try{
    Statement queryE = this.conn.createStatement();
    ResultSet ret  = queryE.executeQuery(query);
    
    if (!ret.next())
        return null;
    else
    {
        String[] str = new String[9];
        str[0] = "asocciviles";
        str[1] = ret.getString("usr");
        str[2] = ret.getString("nombre");
        str[3] = ret.getString("rif");
        str[4] = ret.getString("email");
        str[5] = ret.getString("ubicacion") +".\n Municipio " 
                + ret.getString("municipio") +".\n Estado " + ret.getString("estado");
        str[6] = ret.getString("miembros");
        str[7] = ret.getString("mision");
        str[8] = ret.getString("telefono");
        return str;
    }
    
    }
    catch (SQLException e)
    {
        System.out.println("Errorr");
        return null;
    }
    
}

public String[] JoinBenefactores(String user)
{
    String query =  "SELECT usr, b.nombre, rif, email FROM usuarios AS u "
            + "INNER JOIN benefactores AS b ON (u.nombre = b.usr) "
            + "WHERE usr = " + "'" + user + "'" + ";";
    try{
    Statement queryE = this.conn.createStatement();
    ResultSet ret  = queryE.executeQuery(query);
    
    if (!ret.next())
        return null;
    else
    {
        String[] str = new String[5];
        str[0] = "benefactores";
        str[1] = ret.getString("usr");
        str[2] = ret.getString("nombre");
        str[3] = ret.getString("rif");
        str[4] = ret.getString("email");
        return str;
    }
    
    }
    catch (SQLException e)
    {
        System.out.println("Errorr");
        return null;
    }
    
}

public String[] JoinEstudiantes(String user)
{
    String query =  "SELECT usr, e.nombre, apellido, ci, email, telefono FROM usuarios AS u "
            + "INNER JOIN estudiantes AS e ON (u.nombre = e.usr) "
            + "WHERE usr = " + "'" + user + "'" + ";";
    try{
    Statement queryE = this.conn.createStatement();
    ResultSet ret  = queryE.executeQuery(query);
    
    if (!ret.next())
        return null;
    else
    {
        String[] str = new String[7];
        str[0] = "estudiantes";
        str[1] = ret.getString("usr");
        str[2] = ret.getString("nombre");
        str[3] = ret.getString("apellido");
        str[4] = ret.getString("ci");
        str[5] = ret.getString("email");
        str[6] = ret.getString("telefono");
        return str;
    }
    
    }
    catch (SQLException e)
    {
        System.out.println("Errorr");
        return null;
    }
    
}

public String[] JoinPersonas(String user)
{
    String query =  "SELECT usr, p.nombre, apellido, ci, email, telefono FROM usuarios AS u "
            + "INNER JOIN personas AS p ON (u.nombre = p.usr) "
            + "WHERE usr = " + "'" + user + "'" + ";";
    try{
    Statement queryE = this.conn.createStatement();
    ResultSet ret  = queryE.executeQuery(query);
    
    if (!ret.next())
        return null;
    else
    {
        String[] str = new String[7];
        str[0] = "personas";
        str[1] = ret.getString("usr");
        str[2] = ret.getString("nombre");
        str[3] = ret.getString("apellido");
        str[4] = ret.getString("ci");
        str[5] = ret.getString("email");
        str[6] = ret.getString("telefono");
        return str;
    }
    
    }
    catch (SQLException e)
    {
        System.out.println("Errorr");
        return null;
    }
    
}

public String[] JoinTrabajadores(String user)
{
    String query =  "SELECT usr, t.nombre, apellido, ci, email, telefono FROM usuarios AS u "
            + "INNER JOIN trabajadores AS t ON (u.nombre = t.usr) "
            + "WHERE usr = " + "'" + user + "'" +";";
    try{
    System.out.println(query);    
    Statement queryE = this.conn.createStatement();
    ResultSet ret  = queryE.executeQuery(query);
    
    if (!ret.next())
        return null;
    else
    {
        System.out.println("entro al else");
        String[] str = new String[7];
        str[0] = "trabajadores";
        str[1] = ret.getString("usr");
        str[2] = ret.getString("nombre");
        str[3] = ret.getString("apellido");
        str[4] = ret.getString("ci");
        str[5] = ret.getString("email");
        str[6] = ret.getString("telefono");
        return str;
    }
    
    }
    catch (SQLException e)
    {
        System.out.println("Errorr");
        return null;
    }
    
}
  /*
   * Método que permite buscar a un profesor en la base de datos
   * Parámetros: String[] id -> Contiene los valores de los campos con los que se
   *                            desea hacer match, rigiendose por el orden indicado
   *                            en la variable 'arr' de la clase correspondiente.
   *                            Si el valor de alguna entrada es vacio, se asume que
   *                            no interesa el valor del campo
   * Salida: Arreglo con los elementos encontrados
  */
  public Profesor[] buscarProfesor(String[] id){
       try{
          Profesor[] ret;
          int i;
          id[id.length - 1] = "profesor";
          ResultSet rs = this.select2("trabajadores", id, DataBase.trabArray);
          int size;
          
          if (!rs.next()){
              return null;
          }

          rs.last();
          size = rs.getRow();
          rs.beforeFirst();
          ret = new Profesor[size];

          for(i = 0; i < size; ++ i){
            rs.next();
            ret[i] = new Profesor();
            ret[i].setUsr(rs.getString("usr"));
            ret[i].setNombre(rs.getString("nombre"));
            ret[i].setApellido(rs.getString("apellido"));
            ret[i].setCi(rs.getString("ci"));
            ret[i].setEmail(rs.getString("email"));
            ret[i].setTlf(rs.getString("telefono"));
            ret[i].setDpto(rs.getString("departamento"));
            ret[i].setCord(rs.getString("coordinacion"));
            ret[i].setEsEval(rs.getString("esevaluador"));
          }
          return ret;
      }catch(Exception e0){
          return null;
      }
 }

   /**
   * Método que permite buscar a un obrero en la base de datos
   * Parámetros: String[] id -> Contiene los valores de los campos con los que se
   *                            desea hacer match, rigiendose por el orden indicado
   *                            en la variable 'arr' de la clase correspondiente.
   *                            Si el valor de alguna entrada es vacio, se asume que
   *                            no interesa el valor del campo
   * Salida: Arreglo con los elementos encontrados
   */
  public Obrero[] buscarObrero(String[] id){
        try{
          Obrero[] ret;
          int i;
          id[id.length - 1] = "obrero";
          ResultSet rs = this.select2("trabajadores", id, DataBase.trabArray);
          int size;
          
          if (!rs.next()){
              return null;
          }

          rs.last();
          size = rs.getRow();
          rs.beforeFirst();
          ret = new Obrero[size];

          for(i = 0; i < size; ++ i){
            rs.next();
            ret[i] = new Obrero();
            ret[i].setUsr(rs.getString("usr"));
            ret[i].setNombre(rs.getString("nombre"));
            ret[i].setApellido(rs.getString("apellido"));
            ret[i].setCi(rs.getString("ci"));
            ret[i].setEmail(rs.getString("email"));
            ret[i].setTlf(rs.getString("telefono"));
            ret[i].setDpto(rs.getString("departamento"));
            ret[i].setCord(rs.getString("coordinacion"));
          }
          return ret;
      }catch(Exception e0){
          return null;
      }
  }

  /**
   * Método que permite buscar a un empleado en la base de datos
   * Parámetros: String[] id -> Contiene los valores de los campos con los que se
   *                            desea hacer match, rigiendose por el orden indicado
   *                            en la variable 'arr' de la clase correspondiente.
   *                            Si el valor de alguna entrada es vacio, se asume que
   *                            no interesa el valor del campo
   * Salida: Arreglo con los elementos encontrados
   */
  public Empleado[] buscarEmpleado(String[] id){
        try{
          Empleado[] ret;
          int i;
          id[id.length - 1] = "empleado";
          ResultSet rs = this.select2("trabajadores", id, DataBase.trabArray);
          int size;
          
          if (!rs.next()){
              return null;
          }

          rs.last();
          size = rs.getRow();
          rs.beforeFirst();
          ret = new Empleado[size];

          for(i = 0; i < size; ++ i){
            rs.next();
            ret[i] = new Empleado();
            ret[i].setUsr(rs.getString("usr"));
            ret[i].setNombre(rs.getString("nombre"));
            ret[i].setApellido(rs.getString("apellido"));
            ret[i].setCi(rs.getString("ci"));
            ret[i].setEmail(rs.getString("email"));
            ret[i].setTlf(rs.getString("telefono"));
            ret[i].setDpto(rs.getString("departamento"));
            ret[i].setCord(rs.getString("coordinacion"));
          }
          return ret;
      }catch(Exception e0){
          return null;
      }
  }
  /*
   * Metodo para buscar una asociacion civil en la base de datos
   * Parámetros: String[] id -> Contiene los valores de los campos con los que se
   *                            desea hacer match, rigiendose por el orden indicado
   *                            en la variable 'arr' de la clase correspondiente.
   *                            Si el valor de alguna entrada es vacio, se asume que
   *                            no interesa el valor del campo
   * Salida: Arreglo con los elementos encontrados
  */
  public AsoCivil[] buscarAsoCivil(String[] id){
        try{
          AsoCivil[] ret;
          int i;
          ResultSet rs = this.select2("asocciviles", id, DataBase.asocArray);
          int size;
          
          if (!rs.next()){
              return null;
          }

          rs.last();
          size = rs.getRow();
          rs.beforeFirst();
          ret = new AsoCivil[size];

          for(i = 0; i < size; ++ i){
              rs.next();
              ret[i] = new AsoCivil();
              ret[i].setUsr(rs.getString("usr"));
              ret[i].setNombre(rs.getString("nombre"));
              ret[i].setUg(rs.getString("ubicacion"));
              ret[i].setRif(rs.getString("rif"));
              ret[i].setEmail(rs.getString("email"));
              ret[i].setTlf(rs.getString("telefono"));
              ret[i].setMunicipio(rs.getString("municipio"));
              ret[i].setParroquia(rs.getString("parroquia"));
              ret[i].setEstado(rs.getString("estado"));
              ret[i].setMiembros(rs.getString("miembros"));
              ret[i].setMision(rs.getString("mision"));
          }
          return ret;
        }catch(Exception e){
            return null;            
        }      
 }
    
  /*
   * Metodo para buscar una comunidad en la base de datos
   * Parámetros: String[] id -> Contiene los valores de los campos con los que se
   *                            desea hacer match, rigiendose por el orden indicado
   *                            en la variable 'arr' de la clase correspondiente.
   *                            Si el valor de alguna entrada es vacio, se asume que
   *                            no interesa el valor del campo
   * Salida: Arreglo con los elementos encontrados
  */
  public Comunidad[] buscarComunidad(String[] id){
        try{
          Comunidad[] ret;
          int i;
          ResultSet rs = this.select2("comunidades", id, DataBase.comArray);
          int size;
          
          if (!rs.next()){
              return null;
          }

          rs.last();
          size = rs.getRow();
          rs.beforeFirst();
          ret = new Comunidad[size];
          for(i = 0; i < size; ++ i){
              rs.next();
              ret[i] = new Comunidad();
              ret[i].setUsr(rs.getString("usr"));
              ret[i].setNombre(rs.getString("nombre"));
              ret[i].setUg(rs.getString("ubicacion"));
              ret[i].setRif(rs.getString("rif"));
              ret[i].setEmail(rs.getString("email"));
              ret[i].setTlf(rs.getString("telefono"));
              ret[i].setMunicipio(rs.getString("municipio"));
              ret[i].setParroquia(rs.getString("parroquia"));
              ret[i].setEstado(rs.getString("estado"));
              ret[i].setMiembros(rs.getString("miembros"));
              ret[i].setMision(rs.getString("mision"));
              ret[i].setNumM(rs.getString("nummiembros"));
          }
          return ret;
        }catch(Exception e){
            return null;            
        }      
 }

  /*
   * Metodo para buscar un benefactor en la base de datos
   * Parámetros: String[] id -> Contiene los valores de los campos con los que se
   *                            desea hacer match, rigiendose por el orden indicado
   *                            en la variable 'arr' de la clase correspondiente.
   *                            Si el valor de alguna entrada es vacio, se asume que
   *                            no interesa el valor del campo
   * Salida: Arreglo con los elementos encontrados
  */
  public Benefactor[] buscarBenefactor(String[] id){
        try{
          Benefactor[] ret;
          int i;
          ResultSet rs = this.select2("benefactores", id, DataBase.benArray);
          int size;
          
          if (!rs.next()){
              return null;
          }

          rs.last();
          size = rs.getRow();
          rs.beforeFirst();
          ret = new Benefactor[size];
          for(i = 0; i < size; ++ i){
              rs.next();
              ret[i] = new Benefactor();
              ret[i].setUsr(rs.getString("usr"));
              ret[i].setNombre(rs.getString("nombre"));
              ret[i].setUbicacion(rs.getString("ubicacion"));
              ret[i].setRif(rs.getString("rif"));
              ret[i].setEmail(rs.getString("email"));
              ret[i].setTlf(rs.getString("telefono"));
          }
          return ret;
        }catch(Exception e){
            return null;            
        }      
 }
 
    /*
   * Metodo para buscar un evaluador en la base de datos
   * Parámetros: String[] id -> Contiene los valores de los campos con los que se
   *                            desea hacer match, rigiendose por el orden indicado
   *                            en la variable 'arr' de la clase correspondiente.
   *                            Si el valor de alguna entrada es vacio, se asume que
   *                            no interesa el valor del campo
   * Salida: Arreglo con los elementos encontrados
  */
  public Profesor[] buscarEvaluador(String[] id){
        try{
          Profesor[] ret;
          int i;
          String[] id2 = new String[DataBase.evArray.length];
          
          for(i = 0; i < id.length; ++ i){
            id2[i] = id[i];  
          }
          id2[id2.length - 1] = "1";
          id2[id2.length - 2] = "profesor";
          ResultSet rs = this.select2("trabajadores", id2, DataBase.evArray);
          int size;
          
          if (!rs.next()){
              return null;
          }

          rs.last();
          size = rs.getRow();
          rs.beforeFirst();
          ret = new Profesor[size];
          for(i = 0; i < size; ++ i){
              rs.next();
              ret[i] = new Profesor();
              ret[i].setUsr(rs.getString("usr"));
              ret[i].setNombre(rs.getString("nombre"));
              ret[i].setApellido(rs.getString("apellido"));
              ret[i].setCi(rs.getString("ci"));
              ret[i].setEmail(rs.getString("email"));
              ret[i].setTlf(rs.getString("telefono"));
              ret[i].setDpto(rs.getString("departamento"));
              ret[i].setCord(rs.getString("coordinacion"));
          }
          return ret;
        }catch(Exception e){
            return null;            
        }      
 }

  /* Metodo usado en 'recuperarClave' para obtener la pregunta secreta de un usuario dado su id
   * (nombre de usuario) de la base de datos
   * Parametros: String id -> Nombre del usuario
   * Salida: Pregunta secreta del usuario si este existe. En caso contrario, null
   */
   public String obtenerPreguntaSecreta(String id) throws SQLException {
       try{
           String query = "SELECT * FROM usuarios WHERE nombre = '" + id + "'"+";";
           System.out.println(query);
           Statement queryE = this.conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
           ResultSet rs = queryE.executeQuery(query);
           System.out.println("pregunta");
           if (rs !=null)
           {   
               rs.next();
               String preg = rs.getString("pregunta");
               return preg;
           }
           else
           {               
               return null;
           }
       }
       catch (SQLException E){
           return null;
       }
   }

   /* Metodo usado en 'recuperarClave' para obtener la respuesta secreta de un usuario dado su id
    * (nombre de usuario) de la base de datos.
    * Parametros: String id -> nombre del usuario
    * Salida: Respuesta secreta del usuario si este existe. En caso contrario, null
    */
   public String obtenerRespuestaSecreta(String id) throws SQLException {
       String query = "SELECT respuesta FROM usuarios WHERE nombre = '" + id + "'"+";";
       Statement queryE = this.conn.createStatement();

       ResultSet rs = queryE.executeQuery(query);
       if(!rs.next())
           return null;       
       String resp = rs.getString("respuesta");
       return resp;
   }

   /* Metodo usado en 'recuperarClave' para obtener la clave o contrasena de un usuario dado su id
    * (nombre de usuario) de la base de datos.
    * Parametros: String id -> nombre del usuario
    * Salida: Contrasena del usuario si este existe. En caso contrario, null
    */
   public String obtenerContrasena(String id) throws SQLException {
       String query = "SELECT * FROM usuarios WHERE nombre = '" + id + "'"+";";
       Statement queryE = this.conn.createStatement();
       ResultSet rs = queryE.executeQuery(query);
       if(!rs.next())
           return null;
       String clave = rs.getString("contrasena");
       return clave;
   }
   
   /*
    * Metodo para ascender a profesores al estatus de evaluador
    * Precondicion: El profesor 'p' exoste en la base de datos
    * Parametros: Profesor p -> Profesor que se desea ascender a evaluador
    */
   public void ascenderProfesor(Profesor p) throws Exception{
       String query = "UPDATE trabajadores SET esevaluador = '1' WHERE tipo = 'profesor' AND ci = '" + p.getCi() + "';";
       Statement queryE = this.conn.createStatement();
       queryE.executeUpdate(query);
       return;
   }

   /*
    * Metodo para descender a profesores del estatus de evaluador
    * Precondicion: El profesor 'p' existe en la base de datos
    * Parametros: Profesor p -> Profesor que se desea descender
    */
   public void descenderProfesor(Profesor p) throws Exception{
       String query = "UPDATE trabajadores SET esevaluador = '0' WHERE tipo = 'profesor' AND ci = '" + p.getCi() + "';";
       Statement queryE = this.conn.createStatement();
       queryE.executeUpdate(query);
       return;
   }
   
   /* Metodo para eliminar a un usuario de la base de datos.
    * Parametros: Usuario u -> Usuario que se desea eliminar
    *             String tipo -> tipo de usuario del sistema
    */
   public void eliminarCuenta(Usuario u, String tipo) throws Exception{
     
     //Primero, se reasignan todos los proyectos del usuario a eliminar al usuario generico
     String query = "UPDATE proyectos set nombre = 'adminProy' WHERE nombre = '" + u.getNombre() + "';";
     this.conn.createStatement().executeUpdate(query);
     
     //Se elimina el usuario en la tabla respectiva
     query = "DELETE FROM " + tipo + " WHERE usr = '" + u.getNombre() + "';";
     this.conn.createStatement().executeUpdate(query);
     
     //Se elimina el usuario de la tabla de usuarios
     query = "DELETE FROM usuarios WHERE nombre = '" + u.getNombre() + "';";
     this.conn.createStatement().executeUpdate(query);
     return;
   }
}
